import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Clase Escenario representa el escenario del juego
 * 
 * @author Poul Henriksen
 *         Guadalupe Mtz. Rangel
 * @version 29 de abril de 2012
 */
public class Escenario extends World
{
    private static final GreenfootImage escenario = new GreenfootImage("snow.png"); //imagen del escenario del juego
    private int scrollSpeed;        //variable para indicar la direccion del scroll
    private GreenfootImage scrollingImage;  
    private int scrollPosition = 0;  //Posicion inicial de la imagen
    private Contador contador;       // Contador para las vidas 
    private Contador cuentaP;        //Declaracion de un contador para los puntos
    private int vidas;               //representa el numero de vidas que tiene el jugador
    private int puntos;              //puntos acumulados
    private String cadena;           //Cadena para mostrasr en pantalla
    private int nivel;               //nivel del juego
    private Texto mensaje;           //objeto de la clase Texto para mostrar un mensaje 
    private Texto mensaje1;          //objeto de la clase Texto para mostrar un mensaje 
    private Menu menu;              //variable de tipo Menu pata pintar el menu
    private Menu jugar;             //variable de tipo Menu pata crear el boton jugar
    private Menu ayuda;             //variable de tipo Menu pata crear el boton ayuda
    private Menu creditos;          //variable de tipo Menu pata crear el boton creditos
    private Menu regresar;          //variable de tipo Menu pata crear el boton regresar a menu
  
    private int cont=0;             //inicializa contador 
    
    public static final int lineas=6;   //Variablea pa ra limitar el ancho de la figura
    public static final int tamy=300;   //Tamaño en el que pueden aparecer objetos peces y cubos
    public static final int dy=6;       //Divide el escenario en 6 partes
    
    private int activo;                //activoera para el estado de menu  1-activo, 2-desactivo      
    private int opcion;              //variable para escoger la opcion del menu          
    private boolean terminaNivel;    //variable que indica si termina nivel o no
    private Cronometro cronometro;  //variable para crear un objeto Cronometro

    /**
     * Constructor para el escenario del juego
     * 
     */
    public Escenario()
    {    
        super(600, 400, 1); 
        puntos=0;
        vidas=3;
        nivel=0;
        opcion=0;
        activo=1;
        act();
    }

    /**
     * Programa principal del escenario
     */
    public void act()
    {
       switch(opcion)
        {
            case 0:
                menu(activo);
                break;
            case 1:
                jugar(activo);
                break;
            case 2:
                ayuda(activo);
                break;
            case 3:
                creditos(activo);
                break;       
        }
    }
    
    /**
     * Paint scrolling image at given position and make sure the rest of
     * the background is also painted with the same image.
     */
    private void paint(int position)
    {
        GreenfootImage bg = getBackground();      //obtener el fonco
        bg.drawImage(scrollingImage,0,position);
        bg.drawImage(scrollingImage,0,position -scrollingImage.getHeight());
    }

    /**
     * Returns an image with the given dimensions.
     */
    private GreenfootImage getScrollingImage(int width, int height)
    {
        GreenfootImage image = new GreenfootImage(width, height);
        for(int x = 0; x < width; x += escenario.getWidth()) 
        {
            for(int y = 0; y < height; y += escenario.getHeight()) 
            {
                image.drawImage(escenario, x,y);
            }
        }
        return image;
    } 

    /**
     *Actualiza el contador de los puntos
     *@paradum puntos es el valor que le sera sumado a los puntos
     */
    public void actualizaPuntos(int p)
    {
        puntos=puntos+p;
        cuentaP.actualiza(puntos);
    }

    /**
     * Actualiza el contador de vidas y muestra mensaje si las vidas son igual a cero
     * 
     */
    public void disminuyeVida()
    {
        vidas=vidas-1;
        contador.actualizaV(vidas);
        if(vidas==0&&nivel==0||nivel==1)
        {
            mensaje=new Texto("PERDISTE!!!");
            addObject(mensaje,250,200);
            Greenfoot.playSound("lose.WAV");
            terminaNivel=false;
            Greenfoot.delay(100);
            removeObject(mensaje);
            remove();
            cambiaOpcion(0);
        }
    }

    /**
     * Dibuja la portada principal del juego
     * @paradum 
     */
    public  void menu(int b)
    { 
        if(b==1)
        {
        GreenfootImage fondo= new GreenfootImage("nieve1.png");
        fondo.scale(600,400);
        setBackground(fondo);
        menu = new Menu(1);
        addObject(menu, 100, 336);
        ayuda = new Menu(2);
        addObject(ayuda, 310, 254);
        creditos= new Menu(3);
        addObject(creditos, 518, 331);
        activo=0;
       }
    }
   
    /**
     * Agrega al mundo los objetos que se repiten en cada nivel y cambia de nivel
     */
    public void jugar(int b)
    {
        cont++;
        if( b == 1)
        {
          terminaNivel=false;
          GreenfootImage background = new GreenfootImage(800, 400);
          scrollingImage = getScrollingImage(800, 400);
          background.drawImage(scrollingImage, 0, 0);
          setBackground(background);
          Penguin penguin = new Penguin();
          addObject(penguin, 300, 350);
          Hoja hoja1 = new Hoja();
          addObject(hoja1, 299,51);
          
           vidas=3;
           contador=new Contador();            //se crea un nuevo contador
           addObject(contador,100,50);        //se agrega un contador al mundo 
           contador.actualizaV(vidas);         //se actualiza el valor del contador
            
           cuentaP=new Contador();
           addObject(cuentaP,500,50);  
           cuentaP.actualiza(puntos);
          
           cronometro=new Cronometro();            //se crea un nuevo contador
           addObject(cronometro ,300,23);   
           Texto texto2 = new Texto("PUNTOS");
           addObject(texto2, 462, 25);
           texto2.setLocation(498, 23);
           Texto texto3 = new Texto("VIDAS");
           addObject(texto3, 330, 259);
           texto3.setLocation(95, 22);
           regresar= new Menu(0);
           addObject(regresar, 530, 120);
           setPaintOrder(Penguin.class,Hoyo.class);
           nivel=0;
           activo=0;   
        }
    
       
       switch(nivel)
        {
            case 0:
               nivel1();
               break;
            case 1:
              nivel2();
               break;
            case 2:
               nivel3();
               break;
        }
    }
    
    /**
     * Desplaza la imagen, realiza el scroll
     */   
    public void scroll()
    {
        if(nivel==0||nivel==1)
        {
            scrollSpeed=-6;
        }
        else
           scrollSpeed=4;
        if(scrollSpeed > 0 && scrollPosition <= 0) 
        {
            scrollPosition = getHeight();
        }
        if(scrollSpeed < 0 && scrollPosition >= getHeight()) 
        {
            scrollPosition = 0;
        }
        scrollPosition -= scrollSpeed;
        paint(scrollPosition);
    }
    
    /**
     * Prepare the world for the start of the program. That is: create the initial
     * objects and add them to the world.
     */
    private void nivel1()
    {
    
       if(terminaNivel == false)
       {
        apareceMontaña();
        aparecePeces();
        moverPeces();
        scroll();   
        if(puntos>=250)
        {
           mensaje=new Texto("FELICIDADES!!! Pasaste al Siguiente Nivel");
           mensaje1= new Texto("oprime la tecla C para continuar");
           addObject(mensaje,250,250);
           addObject(mensaje1,250,300);
           terminaNivel = true;
         }
       }
        else
        {
            if(Greenfoot.isKeyDown("c"))
            { 
                 
               removeObject(mensaje);
               removeObject(mensaje1);   
               puntos=0;
               cuentaP.actualiza(puntos);
               vidas=3;
               contador.actualizaV(vidas);
               nivel++;
               terminaNivel = false;
            }
        }
    }


    /**
     * Prepare the world for the start of the program. That is: create the initial
     * objects and add them to the world.
     */
    private void nivel2()
    {
        if(terminaNivel == false)
        {
           aparecePeces();
           
           apareceCubos();
           apareceMontaña();
           scroll();
           if(puntos>=500)
           {
               mensaje=new Texto("FELICIDADES!!! Pasaste al Siguiente Nivel");
               addObject(mensaje,250,250);
               mensaje1= new Texto("Oprime la tecla C para continuar");
               addObject(mensaje1,250,350);
               terminaNivel=true;
           }
        }
        else
         {
           if(Greenfoot.isKeyDown("c"))
           { 
               removeObject(mensaje);
               removeObject(mensaje1);
               puntos=0;
               cuentaP.actualiza(puntos);
               vidas=3;
               contador.actualizaV(vidas);
               nivel++;
               terminaNivel = false;
             }
        }
    }

    /**
     * Prepara el mundo y agrega los objetos para inicializar el tercer nivel
     */
    public void nivel3()
    {
        
        if(terminaNivel == false)
        {
            aparecePeces();
            apareceCubos();
            aparecePeces();
            apareceCubos();
            apareceHoyo();
            scroll();
       if(puntos>=800)
       {
               mensaje=new Texto("Felicidades, Llegaste a la meta");
               addObject(mensaje,250,250);
               terminaNivel=true;
               remove();
               cambiaOpcion(0);
               nivel=0;
       }
       }
    }
   
    /**
     * Elimina todos los actores del mundo
     */ 
    public void remove()
    {
        int aux;
        aux=getObjects(null).size();
        Actor a;
        for(int f=0;f<aux;f++)
        {
            a = (Actor) getObjects(null).get(0);
            removeObject(a);  
        }
    }
    
    /**
     * Crea la ayuda del juego
     */
    public void ayuda(int b)
    {
        if(b==1)
        {
            GreenfootImage   creditos=new GreenfootImage("ayuda.png");
            creditos.scale(600,400);
            setBackground(creditos);
            regresar=new Menu(0);
            addObject(regresar,220,370);
            activo=0;
       }
    }
    
    /**
     * Crea los creditos 
     */
    public void creditos(int b)
    {
        if(b==1)
        {   
            GreenfootImage   creditos=new GreenfootImage("creditos.png");
            creditos.scale(600,400);
            setBackground(creditos);
            regresar= new Menu(0);
            addObject(regresar, 518, 370);
            activo=0;
       }
    }
    
    /**
     * Cambia la opcion del actua
     * @opc opcion a realizar 
     */
    public void cambiaOpcion(int opc)
    {
        opcion=opc;
        activo=1;
    }
  
    
   
    /**
     * Agrega montañas en el mundo 
     */
    public void apareceMontaña()
    {
        int xi1;
        int xi2;
        int yi=100;
        xi1=150;
        xi2=450;
        if(cont%5==0)
        {
           addObject(new Mountain(0),xi1,yi);
           addObject(new Mountain(6),xi2,yi);
        }
    }
    
    /**
     * Agrega al mundo peces aleatoriamente 
     */
    public void aparecePeces()
    {
        
        int lineaPeces;
        int a;
        int yp;    
        int xp;
        if(cont%50==0)
        {
             lineaPeces=Greenfoot.getRandomNumber(5)+1;
             yp=100;
             xp=50*lineaPeces+150;
             a= Greenfoot.getRandomNumber(3);
              switch(a)
              {
               case 0:
               {
                    FishGreen fishGreen = new FishGreen(lineaPeces);
                    addObject(fishGreen,xp, yp);
               }
               break;
               case 1:
               {
                    FishYellow fishyellow = new FishYellow(lineaPeces);
                    addObject(fishyellow,xp, yp);
                }
                break;
                case 2:
                {
                    Fish fish = new Fish(lineaPeces);
                    addObject(fish, xp,yp);
                }
                break;
            }
        }           
    }
    
    /**
     * Agrega al mundo los cubos alearoriamente 
     */
     public void apareceCubos()
    {
        
        int lineaCubos;
        int a;
        int yp;    
        int xp;
        if(cont%50==0)
        {
             lineaCubos=Greenfoot.getRandomNumber(5)+1;
             yp=100;
             xp=50*lineaCubos+150;
             a= Greenfoot.getRandomNumber(3);
             Obstaculo cubo=new Obstaculo(lineaCubos);
             addObject(cubo,xp,yp);
        }
    }
     
    /**
     * Agrega hoyos 
    */
    public void apareceHoyo()
    {
        int a;
        int y;    
        int x;
        if(cont%50==0)
        {
             x= Greenfoot.getRandomNumber(550)+25;
             y= Greenfoot.getRandomNumber(250)+150;
             Hoyo hoyo=new Hoyo();
             addObject(hoyo,x,y);
             
        }
    }
    
    /**
     * Regresa el estado del nivel
     * @return terminaNivel indica si el nivel termino
     */public boolean dimeNivel()
    {
        return terminaNivel;
    }
  
    /**
     * Regresa el nivel del juego
     * @return nivel, indica el nivel del juego
     */
    public int nivel()
    {
        return nivel;
    }
    
    
    /**
     * 
     */
    public void moverPeces()
    {
        java.util.List comida; //Lista de comida
        comida=getObjects(Comida.class);
        if(!comida.isEmpty())   
        {
            java.util.Iterator it;  //iterador para acceder al objeto boton
            it=comida.iterator();  //inicializa iterador
            
            while(it.hasNext())
            {                
              Comida pez=(Comida)it.next(); //accede al objeto del iterador
              pez.mover();
            }      
    }
}
            
    public int vidas()
    {
        return vidas;
    }
    
  
}
